/**
 * 获取cookie
 **/
const TokenKey = 'Admin-Token'
function getCookie(name) {
  const reg = RegExp(name + '=([^;]+)')
  const arr = document.cookie.match(reg)
  if (arr) {
    return arr[1]
  } else {
    return ''
  }
}

export function getToken() {
  return getCookie(TokenKey)
}

export function formatMenu(list) {
  let nlist = []
  list.forEach((item) => {
    let find = nlist.find((citem) => item.id == citem.id)
    if (!find) {
      item.path = item.path || item.url
      item.component = (resolve) => require([`@/views${item.url}`], resolve)
      item.redirect = ''
      item.hidden = item.showStatus == 2 ? true : false
      item.title = item.name
      item.meta = { title: item.name, icon: item.icon, permissionId: item.id }
      nlist.push(item)
      if (item.list.length > 0) {
        item.subPermissionList = formatMenu(item.list)
      }
    }
  })
  return nlist
}

// 格式化地区
import area from '@/assets/area_format_object'

export function getArea(index = 9, p = process.env.VUE_APP_CODE) {
  return formatArea(area, index, p)
}

function formatArea(area, index, p) {
  let data = []
  for (let key in area) {
    if (String(key).indexOf(p) >= 0) {
      if (String(key).length == index) {
        data.push({
          value: area[key].n,
          label: area[key].n
        })
      } else if (area[key].c) {
        data.push({
          value: area[key].n,
          label: area[key].n,
          children: formatArea(area[key].c, index, p)
        })
      }
    }
  }
  return data
}

// 打开websocket
function openSocket() {
  let socket
  let userInfo = JSON.parse(localStorage.getItem('userInfo'))
  if (typeof WebSocket == 'undefined') {
    console.log('您的浏览器不支持WebSocket')
  } else {
    console.log('您的浏览器支持WebSocket')
    //指定要连接的服务器地址与端口
    var socketUrl = `wss://${process.env.VUE_APP_WEBSOCKET}/websocket/${userInfo.id}`
    if (socket != null) {
      socket.close()
      socket = null
    }
    // 实例化WebSocket对象，建立连接
    socket = new WebSocket(socketUrl)
    //打开事件
    socket.onopen = function () {
      console.log('websocket已打开')
      setInterval(() => {
        socket.send('success')
      }, 50 * 1000)
    }
    //获得消息事件
    socket.onmessage = function (msg) {
      if (msg.data == 'success') {
        return
      }
      //判断是不是自己拨出去的通话
      let data = JSON.parse(msg.data)
      console.log('==服务端回应: ', msg.data)
      if (data.source == 1) {
        window.vue.$bus.$emit('call', msg.data)
      }
      if (data.source == 5) {
        window.vue.$bus.$emit('totalNumber', msg.data)
      }
      //消息进入后的处理逻辑
    }
    //关闭事件
    socket.onclose = function () {
      console.log('websocket已关闭')
      window.socket = null
      openSocket()
    }
    //发生了错误事件
    socket.onerror = function () {
      console.log('websocket发生了错误')
      window.socket = null
    }
    window.socket = socket
  }
}
/**
 * 唤起文件选择窗口，并获取选择的文件
 * @param {*} multiple // 是否支持多选
 * @param {*} accept // 文件上传格式限制
 * @param {*} limit // 单次上传最大数
 * @param {*} fileSize // 单次上传最大数
 * @returns
 */
async function getWinFiles(options) {
  const { multiple, accept, limit, fileSize, dropzone } = {
    multiple: true,
    accept: '',
    limit: 1,
    fileSize: 500,
    ...options
  }

  // 创建文件选择元素
  const input = document.createElement('input')
  input.setAttribute('type', 'file')
  input.setAttribute('style', 'display:none')
  input.setAttribute('multiple', multiple)
  input.setAttribute('accept', accept)
  input.setAttribute('dropzone', dropzone)
  // 将文件选择元素添加到文档中
  document.body.appendChild(input)

  // 触发文件选择元素的点击事件
  input.click()

  // 等待文件选择元素的change事件
  const files = await new Promise((resolve, reject) => {
    input.addEventListener('change', (e) => {
      const files = Object.values(e.target.files) || []
      // 从文档中移除文件选择元素
      document.body.removeChild(input)

      // 判断是否是设置的上传文件
      const filesTypeList = files.map((item) => {
        let list = item.name.split('.')
        let current = list.length - 1
        return list[current]
      })
      let flag = false
      filesTypeList.forEach((item) => {
        if (accept.indexOf(item) < 0) {
          flag = true
        }
      })
      if (flag) {
        reject({ errorType: 'type', files })
        return
      }
      // 判断是否超出上传数量限制
      if (files.length > limit) {
        reject({ errorType: 'limit', files })
        return
      }

      // 判断是否超出上传文件大小限制
      if (files.some((i) => i.size / 1024 ** 2 > fileSize)) {
        reject({ errorType: 'fileSize', files })
        return
      }
      // 抛出附件，并生成附件uid
      resolve(files.map((file, index) => ({ file, uid: Date.now() + index })))
    })
  })

  return files
}
export { getCookie, openSocket, getWinFiles }
